package net.xdclass.shopproject.controller;

//import net.xdclass.config.SmsService;
//import org.springframework.beans.factory.annotation.Autowired;
//import net.xdclass.config.SmsService;
import org.redisson.RedissonRedLock;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/api/v1/product/")
public class ProjectController {

    private static final String CACHE_KEY_REDLOCK = "xdclass:redlock";

    @Autowired
    private RedissonClient redissonClient1;

    @Autowired
    private RedissonClient redissonClient2;

    @Autowired
    private RedissonClient redissonClient3;


    @RequestMapping("getLock")
    public Object getLock() {
        RLock lock1 = redissonClient1.getLock(CACHE_KEY_REDLOCK);
        RLock lock2 = redissonClient1.getLock(CACHE_KEY_REDLOCK);
        RLock lock3 = redissonClient1.getLock(CACHE_KEY_REDLOCK);

        RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);
        try {
            // waitTime：等待获取锁的最长时间，如果在等待时间内无法获取锁，并且没有其他释放锁，则返回false。如果wait < 0，则无限期等待，直到获得锁定。
            // leaseTime：就是redis key的过期时间，锁的持有时间，可以用ttl查看过期时间。
            // 如果在持有时间结束前锁未被释放，则锁将自动过期，没有进行key续费，并且其他线程可以获得此锁。如果leaseTime = 0，则锁将永久存在，直到被显式释放。
            boolean isLock = redLock.tryLock(1, 20, TimeUnit.SECONDS);
            System.out.println("线程：" + Thread.currentThread().getId() + "，加锁是否成功：" + isLock);
            if (isLock) {
                // 加锁成功，进入处理业务逻辑
                System.out.println("线程：" + Thread.currentThread().getId() + "，加锁成功操作DB");
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 无论如何都要解锁
            redLock.unlock();
        }

        return "success";
    }



//    @Autowired
//    private SmsService smsService;

    @RequestMapping("send")
    public Object send() {

//        smsService.send("123","小滴课堂");
        return "success";
    }
}
